//package com.zhz.mall.common.log.core;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.core.util.StrUtil;
//import com.zhz.mall.common.util.FunctionUtils;
//import org.apache.logging.log4j.Level;
//import org.apache.logging.log4j.message.Message;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.ApplicationListener;
//import org.springframework.core.annotation.Order;
//import org.springframework.stereotype.Component;
//
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//
///**
// * DynamicLogLevelHandler
// * <p>
// * 日志动态 level 处理器
// * 注意：该处理器只是为了紧急修复告警级别错误的日志, 切勿乱用, 应根据业务场景决定日志级别
// *
// * @author zhouhengzhe
// */
//@Component
//@Order(-100)
//public class DynamicLogLevelHandler implements ApplicationListener<LogInfoCreateEvent> {
//
//    private static final ThreadLocal<Long> DEMOTE_HOLDER = new ThreadLocal<>();
//
//    @Autowired
//    private DynamicLogLevelProperties logLevelProperties;
//
//
//    @Override
//    public void onApplicationEvent(LogInfoCreateEvent event) {
//        LogInfo logInfo = event.getSource();
//        Level level = selectLevel(logInfo);
//        logInfo.setLevel(level);
//    }
//
//
//    /**
//     * 重新选择 log 的 level
//     */
//    private Level selectLevel(LogInfo logInfo) {
//        String loggerName = logInfo.getLoggerName();
//        Message message = logInfo.getData();
//        Level level = logInfo.getLevel();
//
//        if (!logLevelProperties.isEnabled()) {
//            return level;
//        }
//
//
//        // error 日志降级处理（配置降级）
//        if (logLevelProperties.isErrorToWarn() && level == Level.ERROR) {
//            return Level.WARN;
//        }
//
//
//        // error 日志降级处理（代码降级）
//        Long demoteTime = DEMOTE_HOLDER.get();
//        if (Objects.nonNull(demoteTime)) {
//            long interval = System.currentTimeMillis() - demoteTime;
//            if (interval < 30_000) {
//                if (level == Level.ERROR) {
//                    return Level.WARN;
//                }
//            } else {
//                // thread local 出问题了还是业务代码出问题了???
//                recovery();
//            }
//        }
//
//
//        if (Objects.isNull(message)) {
//            return level;
//        }
//
//
//        Map<String, List<String>> levelKeywords = logLevelProperties.getLevelKeywords();
//        if (CollUtil.isEmpty(levelKeywords)) {
//            return level;
//        }
//
//
//        // 匹配日志
//        String content = message.getFormattedMessage();
//        Throwable cause = ObjectUtil.defaultIfNull(message.getThrowable(), logInfo.getT());
//        String causeMessage = FunctionUtils.map(cause, Throwable::getMessage);
//
//        for (Map.Entry<String, List<String>> entry : levelKeywords.entrySet()) {
//            for (String keyword : entry.getValue()) {
//                boolean isMatch = "*".equals(keyword) ||
//                        StrUtil.contains(content, keyword) ||
//                        StrUtil.contains(causeMessage, keyword) ||
//                        StrUtil.startWith(loggerName, keyword);
//                if (isMatch) {
//                    return Level.toLevel(entry.getKey(), level);
//                }
//            }
//        }
//
//        return level;
//    }
//
//
//
//    public static void demote() {
//        DEMOTE_HOLDER.set(System.currentTimeMillis());
//    }
//
//
//    public static void recovery() {
//        DEMOTE_HOLDER.remove();
//    }
//
//
//}
